Dateiformat für Verbindungsimport und -export

Der Im- und Export von Wegen verwendet ein einheitliches Dateiformat – aufgrund der großen Datenmenge ein binäres.

Übersteigt eine Verbindungsdatei die vorgegebene Größe, wird automatisch eine weitere begonnen. Die Größenbeschränkung garantiert, dass auch Verbindungsexporte mit sehr vielen Wegen (Größe > 4 GB) einlesbar bleiben.

Eine Verbindungsdatei enthält folgende Daten in folgender Reihenfolge:

1.  Eine Versionsnummer, die spätere Formatänderungen ermöglicht

2.  Anzahl Wegedateien, damit Visum beim Wiedereinlesen erkennt, ob und welche zusätzlichen Dateien gesucht werden müssen

3.  Angabe, ob die Datei die Anzahl Tarifpunkte am Teilweg enthält

4.  Level der in der Datei enthaltenen Fahrpreis-Daten (0 = keine Fahrpreise)

5.  Angabe, ob die Datei Fahrpreise für alle Nachfragesegmente enthält

6.  Angabe, ob die Datei Anbindungsknoten enthält

7.  Angabe, ob die Datei Belastungen enthält. Anzahl und Schlüssel der umgelegten Nachfragesegmente, damit Belastungen und Fahrpreise beim Wiedereinlesen zuordenbar sind. Beim Verbindungsexport ohne Belastungen und ohne Fahrpreise je Nachfragesegment werden keine Nachfragesegmente geschrieben, also wird die Anzahl = 0 gesetzt.

8.  Die Schlüssel sämtlicher ÖV-Verkehrssysteme, des IV-Verkehrssystems für DRT-Reisezeiten und Fahrzeitprofile des Netzes in sortierter Reihenfolge. So muss bei den späteren (sehr zahlreichen) Referenzen auf ÖV-Verkehrssysteme oder Fahrzeitprofile nicht mehr der komplette String-Schlüssel herausgeschrieben werden, sondern der Index kann genutzt werden. Wichtig ist, dass die Gleichheit von ÖV-VSys- und Fahrzeitprofil-Angebot in Netz und Verbindungsdatei verlangt wird. Der Begriff ÖV-Verkehrssysteme umfasst alle ÖV-Linien-VSys, ÖV-Fuß-VSys, ÖV-Zusatz-VSys und Sharing-VSys.

9.  Definition der benutzerdefinierten Attribute an ÖV-Wegen

10.  Sämtliche Verbindungen getrennt nach Relationen

  • Jede Verbindung besteht aus mehreren ÖV-Teilwegen.
  • Nur reine Fußwegverbindungen haben null ÖV-Teilwege.
  • Ein Teilweg ist entweder vom Typ ÖV-Linie und verbindet Fahrzeitprofil-Elemente oder vom Typ ÖV-Zusatz und verbindet Knoten.
Beispiel: Verbindungsdatei im Binärformat
BinaryVersionNo (4 byte-integer)
scConnectionFileIdentifier = „ConnectionFile“ (string)
NumberOfFiles (4 byte-integer)
ContainsFarePoints (1 byte-integer)
LevelOfFareInformation (1 byte-integer)//value in {0,1,2}
FaresForEachDemandSegment (1 byte-integer)
ContainsConnectorNodes (1 byte-integer)
ContainesVolumes (1 byte-integer)
NumDemandSegments (4 byte-integer)
for each contained DemandSegment in key order:
{
..DemandSegment.Code (string)
}
NumPuTTSys (+ 1 for DRT travel time TSys) (4 byte-integer)
for each contained PuTTSys in key order:
{
..TSys.Code (string)
}
DRT-travel-time-TSys.Code (string)
NumTimeProfiles (4 byte-integer)
for each contained TimeProfile in key order:
{
..Line.Name (string)
..LineRoute.Name (string)
..Direction.Code (string)
..TimeProfile.Name (string)
}
NumUserDefinedAttributes (4 byte-integer)
for each contained UserDefinedAttribute:
{
..ID (string)
..ShortName (string)
..LongName (string)
..Comment (string)
..ValueType (4 byte-integer)
..HasDefaultValue (1 byte-integer)
..DefaultValue (8 byte-real)
..MinimumValue (8 byte-real)
..MaximumValue (8 byte-real)
..NumDecPlaces (4 byte-integer)
..MaxStringLength (4 byte-integer)
..DefaultStringValue (string)
}
for each contained OD relation in key order:
{
..SourceZoneNo (4 byte-integer)
..DestZoneNo (4 byte-integer)
..for each contained Connection:
..{
....ConnectionDepartureTime (4 byte-integer)
....NumLegs (1 byte-integer)
....for each contained ConnectionLeg in logical order:
....{
......DepartureTime (4 byte-integer)
......LegType (1 byte-integer)
........if LegType == 1 // 1st case, leg is of type PuTLine
......{
........TimeProfileIndex (see above) (4 byte-integer)
........FromTimeProfileItem.Index (2 byte-integer)
........ToTimeProfileItem.Index (2 byte-integer)
........LegIsPassengerTripChain (1-byte-integer)
........IsHeadwayBased (1-byte-integer)
......}
......else if LegType == 0 // 2nd case, leg is of type PuTAux
......{
........TSysIndex (see above) (4 byte-integer)
........FromNodeNo (4 byte-integer)
........ToNodeNo (4 byte-integer)
......}
......else if LegType == 2 // 3rd case, leg is of type Sharing
......{
........TSysIndex (see above) (4 byte-integer)
........FromIsZone (1 byte-integer)
........FromNo (4 byte-integer)	// number of sharing station or zone
........ToIsZone (1 byte-integer)
........ToNo (4 byte-integer)	// number of sharing station or zone
......}
......else if LegType == 3 // 4th case, leg is of type DRT
......{
........TSysIndex (see above) (4 byte-integer)
........FromNodeNo (4 byte-integer)
........ToNodeNo (4 byte-integer)
........DRTDetourFactor (8 byte-real)
........DRTWaitTime (4 byte-integer)
......}
......if ContainsFarePoints (4 byte-integer)
......{
........NumFarePoints (4 byte-integer)
......}
......if LevelOfFareInformation = 2
......{
........if(FaresForEachDemandSegment)
........{
..........for each contained DemandSegment in key order:
..........{
............LegFare (8 byte-double)
..........}
........}
........else
........{
..........LegFare (8 byte-real)
........}
......}
....}
....for each contained DemandSegment in key order:
....{
......Volume (8 byte-double)
....}
....if LevelOfFareInformation = 1
....{
......if(FaresForEachDemandSegment)
......{
........for each contained DemandSegment in key order:
.........{
..........ConnectionFare (8 byte-double)
........}
......}
......else
......{
........ConnectionFare (8 byte-real)
......}
......if ContainsConnectorNodes
......{
........FromNodeNo (4 byte-integer)
........ToNodeNo (4 byte-integer)
......}
......for each contained UserDefinedAttribute:
.......{
........HasValue (1 byte-integer)
........if HasValue
........{
..........Value (1 byte-integer/4 byte-integer/8 byte-double/string)
........}
......}
....}
..}
..-1	(4 byte-integer)
}
-1

Hinsichtlich der Semantik ist Folgendes zu beachten:

  • Werden zwischen zwei ÖV-Teilwegen Umsteigefußwege benutzt, so sind diese nicht Bestandteil der Datei. Sie ergeben sich aus Start- und Endpunkt des Weges (jeweils Bezirk oder Haltestellenbereich) und den zulässigen Verkehrssystemen (VSysSet) der Umlegung.
  • Es findet – im Gegensatz zur internen Verbindungssuche – keine Überprüfung statt, ob die in den eingelesenen Verbindungen benutzten Fahrtabschnitte aktiv sind.

Hinsichtlich des exakten Formats ist Folgendes zu beachten:

  • Die Intel-Order („Little-Endian“) ist einzuhalten:
  • Es gibt kein Alignment, also werden 4+1+2 Bytes wirklich nur als 7 Bytes exportiert.
  • Strings werden wie folgt geschrieben:
  • Länge als 2 Byte-Integer
  • Zeichen als Folge von Characters (je 1 Byte)

Für benutzerdefinierte Attribute gilt Folgendes:

  • Die Attributwerte einer Verbindung werden in der Reihenfolge geschrieben, in der auch die Attribute im Header definiert sind.
  • Die erlaubten Werte für ValueType entsprechen denen in der COM-Dokumentation aufgeführten (vgl. in der Online COM-Hilfe > Enumerations > EnumValueType Enumeration). Formelattribute dürfen nicht in der Verbindungsdatei definiert werden. Die entsprechenden Datentypen sind in der untenstehenden Tabelle aufgeführt.

Identifier

Numerischer Wert

Datentyp

ValueType_Int

1

4 byte-integer

ValueType_Real

2

8 byte-double

ValueType_String

5

string

ValueType_Duration

6

4 byte-integer

ValueType_TimePoint

7

4 byte-integer

ValueType_Filename

8

string

ValueType_Bool

9

1 byte-integer

ValueType_LongLength

12

8 byte-double

ValueType_ShortLength

13

8 byte-double

ValueType_StringLong

62

string

ValueType_LongDuration

165

4 byte-integer